#ifndef __SYS_H
#define __SYS_H
#include "main.h"
#include "SEGGER_RTT.h"


typedef struct
{
    GPIO_TypeDef *GPIOx;            // 指向哪个IO口
    LL_GPIO_InitTypeDef GPIO_Param; // 初始化参数
    uint8_t InitValue;
} GPIO_Init_Param_Typedef;

// 位带访问原理:                                 基地址        上移32M字节    字节偏移*32      位偏移 * 4
#define BIT_ADDR(addr, bit) ((addr & 0xF0000000) + 0x2000000 + ((addr & 0xFFFFF) << 5) + (bit << 2))
#define BIT(addr, bit) *((volatile uint32_t *)(BIT_ADDR(addr, bit)))
#define ODR_OFFSET 12
#define IDR_OFFSET 8
#define PAout(n) BIT((GPIOA_BASE + ODR_OFFSET), n)
#define PBout(n) BIT((GPIOB_BASE + ODR_OFFSET), n)
#define PCout(n) BIT((GPIOC_BASE + ODR_OFFSET), n)
#define PDout(n) BIT((GPIOD_BASE + ODR_OFFSET), n)
#define PEout(n) BIT((GPIOE_BASE + ODR_OFFSET), n)
#define PFout(n) BIT((GPIOF_BASE + ODR_OFFSET), n)
#define PGout(n) BIT((GPIOG_BASE + ODR_OFFSET), n)
#define PAin(n) BIT((GPIOA_BASE + IDR_OFFSET), n)
#define PBin(n) BIT((GPIOB_BASE + IDR_OFFSET), n)
#define PCin(n) BIT((GPIOC_BASE + IDR_OFFSET), n)
#define PDin(n) BIT((GPIOD_BASE + IDR_OFFSET), n)
#define PEin(n) BIT((GPIOE_BASE + IDR_OFFSET), n)
#define PFin(n) BIT((GPIOF_BASE + IDR_OFFSET), n)
#define PGin(n) BIT((GPIOG_BASE + IDR_OFFSET), n)

void Delay_us(uint32_t nus);
void MCU_Standby();
void SystemClockConfigHSE(void);
void SystemClockConfigHSI(void);
void SystemPoweronInitWithHSE(void);
void SystemPoweronInitWithHSI(void);
void SystemClock_Config(void);
void SystemPoweronInit();
void GPIO_Init(GPIO_Init_Param_Typedef *pGPIO_Init_Param);
uint8_t Delay_us_With_Break_by_Value(uint32_t nus, volatile uint8_t *pValue);
void Delay_us_with_Break_by_Function(uint32_t nus, uint8_t(*fun(void)));
/*
    这个函数可使用的循环中,不断的调用它,它会迅速返回,但随时间每一毫秒会将count + 1
    前题是在循环的其它部分,或其它中断函数内,没有操作sysTick
 */
__STATIC_FORCEINLINE void add_1_per_1ms(uint32_t *count)
{
    if (SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)
    {
        (*count)++;
    }
}

/* 临时用的 */
extern volatile uint32_t tim1_count;
void TIM1_Init(void);

#ifdef DEBUG
#define LOG SEGGER_RTT_printf
#else
#define LOG
#endif

#endif
